package framework.util.queryFilter.service;

import framework.util.queryFilter.service.impl.QueryFilter;

import java.util.List;

/**
 * @author 吴宇亮 2019/2/7 0007 17:53
 */
public interface IBaseService<BoType, LidType> {

    /**
     * 获取当前service对应的持久层javabean的Class
     * @return
     */
    Class<BoType> getPersistType();

    /**
     * 向数据库insert插入bo
     */
    void add(BoType bo);

    /**
     * 向数据库insert批量插入bo
     */
    void addBatch(List<BoType> list);

    /**
     * 向数据库insert更新bo
     */
    void update(BoType bo);

    /**
     * 向数据库insert批量更新bo
     */
    void updateBatch(List<BoType> list);

    /**
     * 想数据库insert或update更新bo。如果bo的lid为null，则进行insert操作；如果bo的lid不为null，则进行update操作
     */
    void merge(BoType bo);

    /**
     * 想数据库insert或update批量更新bo。如果bo的lid为null，则进行insert操作；如果bo的lid不为null，则进行update操作
     */
    void mergeBatch(List<BoType> list);

    /**
     * 根据filter的条件删除
     */
    void removeByQueryFilter(QueryFilter filter);

    /**
     * 向数据库删除bo
     */
    void remove(BoType bo);

    /**
     * 向数据库根据lid删除bo
     */
    void removeById(LidType lid);

    /**
     * 批量删除bo
     */
    void removeBatch(List<BoType> bo);

    /**
     * 伪删除
     */
    void removeFakeByQueryFilter(QueryFilter filter);

    /**
     * 伪删除
     */
    void removeFake(BoType bo);

    /**
     * 伪删除
     */
    void removeFakeById(LidType bo);

    /**
     * 伪删除
     */
    void removeFakeBatch(List<BoType> list);

    /**
     * 根据主键查询BoType
     * @param lid 主键, 默认为'lid'
     */
    BoType get(LidType lid);

    /**
     * 根据主键查询BoType
     * @param lidName 主键名称
     * @param lid 主键值
     */
    BoType get(String lidName, LidType lid);

    /**
     * 根据QueryFilter查询
     * @param filter 查询条件
     */
    List<BoType> getAll(QueryFilter filter);

    /**
     * 返回所有的记录
     */
    List<BoType> getAll();

    /**
     * 根据QueryFilter查询，返回查询到的第一个结果；如果查询结果为空则返回null
     * @param filter 查询条件
     */
    BoType get(QueryFilter filter);

    /**
     * 获取表的记录的数量
     */
    int getCount();

    /**
     * 根据QueryFilter查询, 获取符合条件的记录的数量
     * @param filter 查询条件
     */
    int getCount(QueryFilter filter);


}
